home *** CD-ROM | disk | FTP | other *** search
/ BMUG Revelations / BMUG Revelations.toast / Programming / Programming Languages / UCB Logo 3.0 / CSLS / fsm < prev    next >
Text File  |  1993-08-05  |  7KB  |  313 lines

  1. TO ACCEPT
  2. LOCAL "OLDPOS
  3. MAKE "OLDPOS CURSOR
  4. SETCURSOR [15 1]
  5. TYPE "ACCEPT
  6. SETCURSOR :OLDPOS
  7. END
  8.  
  9. TO ACCEPTPART :MACHINE
  10. OP LAST :MACHINE
  11. END
  12.  
  13. TO ARRANGE :MOVE
  14. LOCAL [FROM INPUT TO ARROW]
  15. MAKE "FROM FIRST :MOVE
  16. MAKE "INPUT FIRST BF :MOVE
  17. MAKE "TO LAST :MOVE
  18. MAKESTATE :FROM
  19. MAKESTATE :TO
  20. MAKE "ARROW WORD :FROM :INPUT
  21. IFELSE NAMEP :ARROW [ARRANGE.DUPLICATE :ARROW] [ARRANGE.UNSEEN :ARROW]
  22. END
  23.  
  24. TO ARRANGE.DUPLICATE :ARROW
  25. IF MEMBERP :TO THING :ARROW [STOP]
  26. MAKE "TROUBLE "TRUE
  27. MAKE :ARROW MERGE :TO THING :ARROW
  28. END
  29.  
  30. TO ARRANGE.UNSEEN :ARROW
  31. MAKE :FROM FPUT :INPUT THING :FROM
  32. TEMPMAKE :ARROW SINGLE :TO
  33. END
  34.  
  35. TO BLANK
  36. LOCAL "OLDPOS
  37. MAKE "OLDPOS CURSOR
  38. SETCURSOR [15 1]
  39. TYPE "|      |
  40. SETCURSOR :OLDPOS
  41. END
  42.  
  43. TO BUILD.STATE :STATE
  44. OP MAP [LINK :STATE ? (FIRST THING WORD :STATE ?)] THING :STATE
  45. END
  46.  
  47. TO DETERMINE :MACHINE
  48. LOCAL [NEWACCEPT ALLSTATES ALIASES TROUBLE TEMPNAMES NEWMOVES]
  49. MAKE "NEWACCEPT ACCEPTPART :MACHINE
  50. MAKE "ALLSTATES []
  51. MAKE "ALIASES []
  52. MAKE "TROUBLE "FALSE
  53. MAKE "TEMPNAMES []
  54. FOREACH MOVEPART :MACHINE [ARRANGE ?]
  55. IF NOT :TROUBLE [FOREACH :TEMPNAMES [ERN ?] OP :MACHINE]
  56. RESOLVE :ALLSTATES
  57. MAKE "NEWMOVES REBUILD :ALLSTATES
  58. FOREACH :TEMPNAMES [ERN ?]
  59. OP LINK (STARTPART :MACHINE) :NEWMOVES :NEWACCEPT
  60. END
  61.  
  62. TO FSM :MACHINE
  63. CT
  64. SETCURSOR [0 3]
  65. FSM1 FIRST :MACHINE FIRST :MACHINE FIRST BF :MACHINE LAST :MACHINE
  66. END
  67.  
  68. TO FSM1 :START :HERE :MOVES :ACCEPT
  69. IFELSE MEMBERP :HERE :ACCEPT [ACCEPT] [REJECT]
  70. FSM1 :START (FSMNEXT :START :HERE RC :MOVES) :MOVES :ACCEPT
  71. END
  72.  
  73. TO FSMNEXT :START :HERE :INPUT :MOVES
  74. BLANK
  75. TYPE :INPUT
  76. IF EQUALP :INPUT CHAR 13 [TYPE CHAR 10  OP :START]
  77. IF EQUALP :INPUT CHAR 10 [OP :START]
  78. CATCH "ERROR [OP LAST FIND [FSMTEST :HERE :INPUT ?] :MOVES]
  79. OP -1
  80. END
  81.  
  82. TO FSMTEST :HERE :INPUT :MOVE
  83. OP AND (EQUALP :HERE FIRST :MOVE) (EQUALP :INPUT FIRST BF :MOVE)
  84. END
  85.  
  86. TO GAME :WHICH
  87. FSM THING WORD "MACH :WHICH
  88. END
  89.  
  90. TO GETALIAS :LIST
  91. CATCH "ERROR [OP FIRST FIND [EQUALP :LIST LAST ?] :ALIASES]
  92. OP []
  93. END
  94.  
  95. TO LINK :ONE :TWO :THREE
  96. OP (LIST :ONE :TWO :THREE)
  97. END
  98.  
  99. TO MACHINE :REGEXP
  100. LOCAL "NEXTSTATE
  101. MAKE "NEXTSTATE 0
  102. OP OPTIMIZE DETERMINE NONDET :REGEXP
  103. END
  104.  
  105. TO MAKESTATE :STATE
  106. IF MEMBERP :STATE :ALLSTATES [STOP]
  107. MAKE "ALLSTATES FPUT :STATE :ALLSTATES
  108. TEMPMAKE :STATE []
  109. END
  110.  
  111. TO MANY.MOVES :PARTMOVE :ACCEPT
  112. FOREACH :ACCEPT [NEWMOVES SINGLE FPUT ? :PARTMOVE]
  113. END
  114.  
  115. TO MAPND :EXPRS
  116. OP MAP [NONDET ?] :EXPRS
  117. END
  118.  
  119. TO MERGE :NEW :LIST
  120. IF EMPTYP :LIST [OP FPUT :NEW []]
  121. IF :NEW < FIRST :LIST [OP FPUT :NEW :LIST]
  122. OP FPUT FIRST :LIST MERGE :NEW BF :LIST
  123. END
  124.  
  125. TO MOVEPART :MACHINE
  126. OP FIRST BF :MACHINE
  127. END
  128.  
  129. TO NDCONCAT :EXPRS
  130. OP REDUCE "STRING MAPND :EXPRS
  131. END
  132.  
  133. TO NDLETTER :LETTER
  134. LOCAL [FROM TO]
  135. MAKE "FROM NEWSTATE
  136. MAKE "TO NEWSTATE
  137. OP LINK :FROM (SINGLE (LINK :FROM :LETTER :TO)) (SINGLE :TO)
  138. END
  139.  
  140. TO NDMANY :REGEXP
  141. OP NDMANY1 NONDET :REGEXP
  142. END
  143.  
  144. TO NDMANY1 :MACHINE
  145. LOCAL [START MOVES ACCEPT]
  146. MAKE "START STARTPART :MACHINE
  147. MAKE "MOVES MOVEPART :MACHINE
  148. MAKE "ACCEPT ACCEPTPART :MACHINE
  149. FOREACH :MOVES [IF EQUALP :START FIRST ? [MANY.MOVES BF ? :ACCEPT]]
  150. OP LINK :START :MOVES (FPUT :START :ACCEPT)
  151. END
  152.  
  153. TO NDOR :EXPRS
  154. OP UNION NEWSTATE MAPND :EXPRS
  155. END
  156.  
  157. TO NEWACCEPT :NEW
  158. IF NOT MEMBERP :NEW :ACCEPT [MAKE "ACCEPT SE :NEW :ACCEPT]
  159. END
  160.  
  161. TO NEWMOVES :NEW
  162. MAKE "MOVES SE :NEW :MOVES
  163. END
  164.  
  165. TO NEWSTATE
  166. MAKE "NEXTSTATE :NEXTSTATE+1
  167. OP :NEXTSTATE
  168. END
  169.  
  170. TO NONDET :REGEXP
  171. IF WORDP :REGEXP [OP NDLETTER :REGEXP]
  172. IF EQUALP FIRST :REGEXP "OR [OP NDOR BF :REGEXP]
  173. IF EQUALP FIRST :REGEXP "* [OP NDMANY LAST :REGEXP]
  174. OP NDCONCAT :REGEXP
  175. END
  176.  
  177. TO OPTIMIZE :MACHINE
  178. LOCAL [START MOVES ACCEPT GOODSTATES GOODMOVES OLDMOVES]
  179. MAKE "START STARTPART :MACHINE
  180. MAKE "MOVES MOVEPART :MACHINE
  181. MAKE "ACCEPT ACCEPTPART :MACHINE
  182. MAKE "GOODSTATES SINGLE STARTPART :MACHINE
  183. MAKE "GOODMOVES []
  184. DO.UNTIL [MAKE "OLDMOVES :GOODMOVES ~
  185.           MAKE "MOVES FILTER [OPTIMIZE2 ?] :MOVES] ~
  186.          [EQUALP :OLDMOVES :GOODMOVES]
  187. OP LINK :START :GOODMOVES (FILTER [MEMBERP ? :GOODSTATES] :ACCEPT)
  188. END
  189.  
  190. TO OPTIMIZE2 :MOVE
  191. IF NOT MEMBERP FIRST :MOVE :GOODSTATES [OP "TRUE]
  192. MAKE "GOODMOVES FPUT :MOVE :GOODMOVES
  193. IF NOT MEMBERP LAST :MOVE :GOODSTATES ~
  194.    [MAKE "GOODSTATES FPUT LAST :MOVE :GOODSTATES]
  195. OP "FALSE
  196. END
  197.  
  198. TO REBUILD :STATELIST
  199. OP MAP.SE [BUILD.STATE ?] :STATELIST
  200. END
  201.  
  202. TO REJECT
  203. LOCAL "OLDPOS
  204. MAKE "OLDPOS CURSOR
  205. SETCURSOR [15 1]
  206. TYPE "REJECT
  207. SETCURSOR :OLDPOS
  208. END
  209.  
  210. TO RESOLVE :STATES
  211. IF EMPTYP :STATES [STOP]
  212. LOCAL "STATE
  213. MAKE "STATE FIRST :STATES
  214. RESOLVE SE (BF :STATES) ~
  215.            (MAP.SE [RESOLVE.ARROW WORD :STATE ?] THING :STATE)
  216. END
  217.  
  218. TO RESOLVE.ARROW :ARROW
  219. LOCAL [DESTINATIONS ALIAS]
  220. MAKE "DESTINATIONS THING :ARROW
  221. IF EMPTYP BF :DESTINATIONS [OP []]
  222. MAKE "ALIAS GETALIAS :DESTINATIONS
  223. IF NOT EMPTYP :ALIAS [MAKE :ARROW SINGLE :ALIAS OP []]
  224. MAKE "ALIAS NEWSTATE
  225. MAKESTATE :ALIAS
  226. MAKE :ARROW SINGLE :ALIAS
  227. MAKE "ALIASES FPUT (LIST :ALIAS :DESTINATIONS) :ALIASES
  228. FOREACH :DESTINATIONS [SETUPALIAS ?]
  229. OP :ALIAS
  230. END
  231.  
  232. TO SETA.INPUT :STATE :INPUT
  233. FOREACH (THING WORD :STATE :INPUT) [ARRANGE LINK :ALIAS :INPUT ?]
  234. END
  235.  
  236. TO SETUPALIAS :STATE
  237. IF AND (MEMBERP :STATE :NEWACCEPT) (NOT MEMBERP :ALIAS :NEWACCEPT) ~
  238.    [MAKE "NEWACCEPT FPUT :ALIAS :NEWACCEPT]
  239. FOREACH THING :STATE [SETA.INPUT :STATE ?]
  240. END
  241.  
  242. TO SINGLE :THING
  243. OP (LIST :THING)
  244. END
  245.  
  246. TO STARTPART :MACHINE
  247. OP FIRST :MACHINE
  248. END
  249.  
  250. TO STRING :MACHINE :OTHERS
  251. LOCAL [START MOVES ACCEPT OTHERSTART OTHERMOVES OTHERACCEPT]
  252. MAKE "START STARTPART :MACHINE
  253. MAKE "MOVES MOVEPART :MACHINE
  254. MAKE "ACCEPT ACCEPTPART :MACHINE
  255. MAKE "OTHERSTART STARTPART :OTHERS
  256. MAKE "OTHERMOVES MOVEPART :OTHERS
  257. MAKE "OTHERACCEPT ACCEPTPART :OTHERS
  258. OP LINK :START ~
  259.         (SE :MOVES ~
  260.             (STRING.SPLICE :ACCEPT :OTHERSTART :OTHERMOVES) ~
  261.             :OTHERMOVES) ~
  262.         (STRINGA :ACCEPT :OTHERSTART :OTHERACCEPT)
  263. END
  264.  
  265. TO STRING.COPY :ACCEPT :OTHERSTART :MOVE
  266. OP IFELSE EQUALP :OTHERSTART FIRST :MOVE [MAP [FPUT ? BF :MOVE] :ACCEPT] [[]]
  267. END
  268.  
  269. TO STRING.SPLICE :ACCEPT :OTHERSTART :OTHERMOVES
  270. OP MAP.SE [STRING.COPY :ACCEPT :OTHERSTART ?] :OTHERMOVES
  271. END
  272.  
  273. TO STRINGA :ACCEPT :OTHERSTART :OTHERACCEPT
  274. IF MEMBERP :OTHERSTART :OTHERACCEPT [OP SE :ACCEPT :OTHERACCEPT]
  275. OP :OTHERACCEPT
  276. END
  277.  
  278. TO TEMPMAKE :VAR :VAL
  279. MAKE "TEMPNAMES FPUT :VAR :TEMPNAMES
  280. MAKE :VAR :VAL
  281. END
  282.  
  283. TO UNION :START :MACHINES
  284. LOCAL [MOVES ACCEPT]
  285. MAKE "MOVES []
  286. MAKE "ACCEPT []
  287. FOREACH :MACHINES [UNION1 ?]
  288. OUTPUT LINK :START :MOVES :ACCEPT
  289. END
  290.  
  291. TO UNION1 :MACHINE
  292. NEWMOVES MOVEPART :MACHINE
  293. NEWMOVES MAP [FPUT :START BF ?] ~
  294.              FILTER [EQUALP (STARTPART :MACHINE) (FIRST ?)] MOVEPART :MACHINE
  295. NEWACCEPT ACCEPTPART :MACHINE
  296. IF MEMBERP (STARTPART :MACHINE) (ACCEPTPART :MACHINE) ~
  297.    [NEWACCEPT :START]
  298. END
  299.  
  300. MAKE "MACH1 [1 [[1 A 1] [1 B 1]] [1]]
  301. MAKE "MACH10 [1 [[1 A 1] [1 B 1] [1 C 2] [2 A 3] [2 B 1] [3 A 1]] [1]]
  302. MAKE "MACH2 [1 [[1 A 2] [1 B 2] [1 C 2] [2 A 1] [2 B 1] [2 C 1]] [1]]
  303. MAKE "MACH3 [1 [[1 A 2] [2 B 3] [3 A 3] [3 B 3] [3 C 3]] [3]]
  304. MAKE "MACH4 [1 [[1 A 2] [1 B 3] [1 C 4] [2 A 1] [3 B 1] [4 C 1]] [1]]
  305. MAKE "MACH5 [1 [[1 A 2] [1 B 2] [1 C 2] [2 B 1]] [1]]
  306. MAKE "MACH6 [1 [[1 A 2] [2 A 2] [2 B 2] [2 C 3] [3 A 2] [3 B 2] [3 C 3]] [3]]
  307. MAKE "MACH7 [1 [[1 A 1] [1 B 1] [1 C 2] [2 C 1]] [1]]
  308. MAKE "MACH8 [1 [[1 A 2] [1 B 1] [1 C 1] [2 A 1] [2 B 2] [2 C 2]] [1]]
  309. MAKE "MACH9 [1 [[1 A 2] [1 B 1] [1 C 1] [2 A 2] [2 B 3] [2 C 1] [3 A 2] ~
  310.                 [3 B 1] [3 C 4] [4 A 2] [4 B 5] [4 C 1] [5 A 6] [5 B 1] ~
  311.                 [5 C 1] [6 A 6] [6 B 6] [6 C 6]] ~
  312.              [6]]
  313.